﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace dacli.modelos.dao
{
    public class ElementosCategoriaDAO : EntidadDao
    {
        public modelos.ElementosCategoria elementosCategoria;
        public modelos.ElementosCategoria asignarId(long id)
        {
            this.consultar("id=" + id);
            return this.elementosCategoria;
        }

        public ElementosCategoriaDAO()
            : base("elementos_categoria")
        {

        }
        public ElementosCategoria getByNombre(string nombre, long categoriaId)
        {
            string sql = "SELECT * FROM " + this.tabla + " WHERE nombre='" + nombre + "' AND examenes_categoria_id=" + categoriaId;
            SqlDataReader reader = conexion.consultar(sql);
            if (reader.Read()) {
                this.elementosCategoria = new ElementosCategoria();
                this.elementosCategoria.id = reader.GetInt32(0);
                this.elementosCategoria.examenesCategoria = new ExamenesCategoriaDAO().asignarId(reader.GetInt64(1));
                this.elementosCategoria.nombre = reader.GetValue(2).ToString();                
                this.elementosCategoria.orden = reader.GetInt32(4);
                this.elementosCategoria.ancho = reader.GetInt32(5);
                reader.Close();
                return this.elementosCategoria;
            }
            return null;
        }

        public override long incluir()
        {
            int unico = elementosCategoria.unico ? 1 : 0;
            string sql = "INSERT INTO " + this.tabla + " (nombre, orden,ancho,unico,examenes_categoria_id) values" +
            "('" + elementosCategoria.nombre + "',"+ this.getSiguienteOrden(elementosCategoria.examenesCategoria.id) +"'," + elementosCategoria.ancho +","+ unico + "," + elementosCategoria.examenesCategoria.id + "')";
            return conexion.ejecutar(sql);
        }

        public override long modificar()
        {
            int unico = elementosCategoria.unico ? 1 : 0;
            string sql = "UPDATE " + this.tabla + " SET "
            + "orden =" + elementosCategoria.orden + ", "
            + "ancho =" + elementosCategoria.ancho + ", "
            + "nombre ='" + elementosCategoria.nombre + "', "
            + "unico =" + unico + ", "
            + "examenes_categoria_id ='" + elementosCategoria.examenesCategoria.id + "' "
            + "WHERE id =" + elementosCategoria.id;
            return conexion.ejecutar(sql);
        }

        public override long eliminar()
        {
            string sql = "DELETE FROM " + this.tabla + " WHERE "
            + "id =" + elementosCategoria.id;
            return conexion.ejecutar(sql);   
        }

        public long getSiguienteOrden(long examenCategoriaId)
        {
            string filtro = "examenes_categoria_id = " + examenCategoriaId;
            string sql = "SELECT MAX(Orden) FROM " + this.tabla + " WHERE "
            + filtro;
            SqlDataReader reader = conexion.consultar(sql);
            long siguiente = 1;
            try
            {

                if (reader.Read())
                {
                    siguiente = this.elementosCategoria.id = reader.GetInt64(0) + 1;
                }
            }
            catch (Exception e) {
                siguiente = 1;
            }
            return siguiente;            
        }

        public override bool consultar(string filtro)
        {
            string sql = "SELECT * FROM " + this.tabla + " WHERE "
            + filtro;
            SqlDataReader reader = conexion.consultar(sql);
            if (reader.Read()) {
                this.elementosCategoria = new ElementosCategoria();
                this.elementosCategoria.id = reader.GetInt32(0);
                this.elementosCategoria.examenesCategoria = new ExamenesCategoriaDAO().asignarId(reader.GetInt64(1));
                this.elementosCategoria.nombre = reader.GetValue(2).ToString();                
                this.elementosCategoria.orden = reader.GetInt32(4);
                this.elementosCategoria.ancho = reader.GetInt32(5);
                reader.Close();
                return true;
            }
            return false;
        }
    }
}
